遠在兩邊(在同一台機器也是可以)的兩個程序(process)互相傳遞訊息就是inter-process communication (簡稱IPC)
**先開口是client端
如果能夠給他們一個讀寫的通道可以更快速就好了,
這時出現Socket[插槽](provided by the OS) ,像是一個門,我們會在第七層與第四層之間對它做讀寫,過程也是像上一篇說的,一層一層封裝往下丟,到目的地再拆封往上丟上來。如圖,Socket位置就是圖中黃色部分
Server端先初始化Socket,然绑定(bind) port,並監聽(listen)port,調用accept阻塞,等待client端連接。這時client也初始化Socket並連接server端,如果成功,這時Server與Client便建立了連線。然後Client發送request,Server端接收並處理request,把Client請求的東西發送給Client端,Client端收到,最后Close 連接,一次的交互即结束。
Socket如其名,[插槽]功能的確像電話『插座』一樣。如以電話系統而言,只要將電話的插座設定好某一號碼,任何一部電話都可透過這個插座和其它電話通訊。要建立Socket你要有
(1)IP(2^32種不同IP)
(2)port number(2^16,一台機器約可以給65536個獨特processes)
IP好懂就是就是你要傳的地址,
而為甚麼要有 port number 呢?
想想,一台機器假設有幾百個process,我們要讓特定的Socket綁定特定的process,因此每個Socket 都給予一個特殊號碼(IP number + TCP port),使用者之間只要記住對方的 Socket 號碼,便可以直接通訊,而不用考慮到底是經過何種網路、或主機放在什麼地方。
就會像這樣:
簡單來說,Socket就是一種作業系統提供的程序間通訊機制。
參見:Socket原理讲解
第八章 TCP Socket 程式介面
之前聽過一個比喻,通訊埠像是郵局的櫃檯,特定號碼的窗口有特定功能,例如幾號櫃檯是處理郵務,幾號是有關金融事務。port number 很像上述概念。
剛剛說有六萬多個port number
0~1023 號的服務已被特別定義
1024~49151有的也被占用
49152~65535目前沒有port被正式註冊占用,你寫程式可以用這裡
EX:
HTTP:80
mail server:25
按此查詢port number服務:port number維基百科
Types of messages exchanged:
分兩類,一個是request,另一個是response
message syntax(語法):
呈現的規格,多少個fields?中間怎麼分隔?長度是可變的嗎?
message semantics(語意):
通常的設計是 type, length, message
EX:integer,4Byte,一串數字
rules:
收到怎樣的message時,server怎麼反應,除了定義正常時回覆,也定義不正常時的回覆(error handling)。
open protocols:
RFCs定義,HTTP protocols 在browser裡面
EX:HTTP,SMTP,NTP
/*也有私人的protocols
EX:Skype/
這裡會視application的功能看看有沒有特別要求
integrity(資料完整性):
與data loss有關,有的需要完全一模一樣。
EX:圖片很需要資料完整性
但是即時語音就還好,偶爾掉一個封包也沒差(人耳朵對於0.1s的延遲覺得不明顯)
timing(即時性):
愈快愈好
EX:即時語音通話,槍戰遊戲
throughput(單位時間處理量)
沒有資料丟失的狀態下設備能接收的最大速率
與流暢與否有關
/**我自己解讀timing 與 throughput 的差別是 一個是傳的速率,另一個是收到的速率(適合評估品質)*/
不同服務所要求的點:
/**best-effort delivery 儘可能做到最好!*/(我們也是喔!!)
在傳輸層,UDP 和 TCP 都是常見的網路通訊協定,都是透過『IP位址』與『TCP Port』形成一個『Socket』進行通訊。但他們倆個運作行為不同。
TCP是一個完整的協定,也就是會經過『建立連線』、『資料傳輸』與最後的『關閉連線』三個階段,屬於reliable transport ,正確性導向與連線導向線(Connection Oriented)。
運作如下:
TCP會為每個封包分配唯一識別碼與序號,可以保證接收端識別封包完整性與順序,接收端收到,如果確認正確會發送
確認信號(Acknowledgement),然後發送端繼續傳。
如果錯誤接收端就不發送Acknowledgement,因此逾時後發送端重新傳,這也是同步傳輸的表現(雙向資料傳輸協定,會等待對方確認是否已正確收到)。
就是因為如此運作,所以TCP顧及:
1.flow control(流量控制)
2.congestion control(阻塞控制)
3.檢查錯誤
缺點是因為要不斷確認,速度會比UDP慢一些。
TCP也不管:
1)timing
2)throughput 最小保證
3)security
基本上TCP不管的,UDP也不會管。屬於unreliable data transfer 不可靠傳輸。
UDP不做錯誤檢查與修正,不會flow control,也不會congestion control。錯了就直接丟棄封包,不會給你重傳,也因為如此,即時性比較高,屬於非連線型(Connectionless)。
**早期需要即時性的功能,UDP占優勢,現在網路愈來愈快,router變強,loss變少,這些即時性的功能使用TCP來傳也很好。
參見:
維基百科 傳輸控制協定
TCP 和 UDP 是什麼:簡單的說明
維基百科 UDP